/*
 * @Date: 2022-02-12 12:23:19
 * @LastEditors: tich425
 * @LastEditTime: 2022-02-12 16:59:32
 * @FilePath: \TodoList\api\todo.go
 * @Description: todo 管理
 */
package api

import (
	"strconv"
	"todo-list/model"
	"todo-list/res"
	"todo-list/service"

	"github.com/gin-gonic/gin"
)

/**
 * @description: 获取全部便签
 * @param {*gin.Context} c
 */
func AllTodo(c *gin.Context) {
	// 获取 query 参数
	p := c.Query("page")
	// 将 p 转为 int 型
	page, err := strconv.Atoi(p)
	// 错误处理
	if err != nil {
		page = 1 // 如果未传入 & 出错，默认为 1
	}

	// 获取 token 中的用户信息
	uid, _ := c.Get("UserID")

	// todo 处理
	service.AllTodo(uid.(uint), page, c)
}

/**
 * @description: 添加便签
 * @param {*gin.Context} c
 */
func AddTodo(c *gin.Context) {
	// 创建结构体实例
	var t model.Todo
	// 获取前端传来的信息
	if err := c.ShouldBindJSON(&t); err != nil {
		res.FailWithDetailed(res.ParamErr, err.Error(), "提交信息非法", c)
		return
	}

	// 获取用户信息
	uid, _ := c.Get("UserID")
	t.UID = uid.(uint)

	// todo 处理
	service.AddTodo(t, c)
}

/**
 * @description: 搜索便签
 * @param {*gin.Context} c
 */
func SearchTodo(c *gin.Context) {
	// 获取前端传来的信息
	title, err1 := c.GetQuery("title")
	if !err1 || len(title) == 0 {
		res.FailWithMessage(res.ParamErr, "提交信息非法", c)
		return
	}

	// 分页
	p := c.Query("page")
	page, err2 := strconv.Atoi(p)
	if err2 != nil {
		page = 1
	}

	// 绑定用户信息
	uid, _ := c.Get("UserID")

	// todo 处理
	service.SearchTodo(uid.(uint), title, page, c)
}

/**
 * @description: 修改便签
 * @param {*gin.Context} c
 */
func UpdateTodo(c *gin.Context) {
	// 创建结构体实例
	var t model.TodoDto
	// 获取前端传来的信息
	if err := c.ShouldBindJSON(&t); err != nil {
		res.FailWithDetailed(res.ParamErr, err.Error(), "提交信息非法", c)
		return
	}

	// 获取用户信息
	uid, _ := c.Get("UserID")

	// todo 处理
	service.UpdateTodo(uid.(uint), t, c)
}

/**
 * @description: 删除便签
 * @param {*gin.Context} c
 */
func RemoveTodo(c *gin.Context) {
	// 创建结构体实例
	var t model.TodoRemove
	// 获取前端传来的信息
	if err := c.ShouldBind(&t); err != nil {
		res.FailWithDetailed(res.ParamErr, err.Error(), "提交信息非法", c)
		return
	}

	// 获取用户信息
	uid, _ := c.Get("UserID")

	// todo 处理
	service.RemoveTodo(uid.(uint), t.ID, c)
}
